/*
** ############################################################################
**     Project   : osdee - Operative Systems Design for Embedded Envrionments
**     File      : OS.h
**     Revision  ; 1.0
**     Abstract  :
**         Scheduler Module API Interface.
**
**     Copyright : 2014 Fernando Rodriguez - Victor Huidobro, 
**                 Open source with out any responsability.
**     
**     mail      : frr@gmail.com, vhuidobrog@gmail.com
** ############################################################################
*/

#ifndef _OS_TASK_H_
#define _OS_TASK_H_

#include "cdef.h"
#include "derivative.h"
#include "Gpt.h"
#include "OS_TaskCfg.h"

/*
** ############################################################################
**     Debug Definition-> Define to enable Debug Routines 
*/                                                
//#define DEBUG_OS_TASK_M

#define ID_OFFSET(ID) (ID - teTaskIdZeroOff)     
#define GET_TCB_REF(ID)  &gPtsTCB[ID_OFFSET(ID)]
#define GET_BUFF_REF(ID) &gPtsBufferState[ID_OFFSET(ID)]
#define BUFFER_CELL_TYPE  te_TaskIdRef

typedef struct{
  UINT8             u8Priority;
  UINT8             u8SetIndex;
  UINT8             u8GetIndex;
  UINT8             u8TaskInBuffer;
  BUFFER_CELL_TYPE  ptsStartAddress;
}tsBufferState;

extern tsTask_Ctrl_Block*   gPtsTCB;
extern teOS_Task_Id         teTaskIdZeroOff;
extern tsBufferState*       gPtsBufferState;
extern volatile void* currentTCB_Stack;

/*
** ============================================================================
**     Activated Tasks - Managment Function.
** ============================================================================
*/
void OS_Init(const tsOS_Des_Cfg* ptOS_Cfg);
void OS_vTask_Ctrl_Block_Init(const tsOS_Des_Cfg* ptOS_Cfg);
void OS_vBuffers_Init(void);
void OS_vSetTaskInBuffer(teOS_Task_Id taskId);
teOS_Task_Id OS_tGetTaskInBuffer(void);
void OS_vStackBlock_Init(UINT8 u8TaskLength);

#pragma CODE_SEG __NEAR_SEG NON_BANKED
  
extern void Os_vWrapperDispatcherFunction(void);
  
#pragma CODE_SEG DEFAULT


#ifdef  DEBUG_OS_TASK_M
void vfnDebugRoutine(void);
#endif

/*
** ============================================================================
**     Activate Task - Definition.
** ============================================================================
*/
teE_OS_ERR ActivateTask(teOS_Task_Id taskId);

/*
** ============================================================================
**     Terminate Task - Definition.
** ============================================================================
*/
teE_OS_ERR TerminateTask(void);

/*
** ============================================================================
**     Dispatcher - Definition.
** ============================================================================
*/
extern void vDispatcher(void);

/*
** ============================================================================
**     GetTaskID - Definition.
** ============================================================================
*/
teE_OS_ERR GetTaskID(te_TaskIdRef pteTaskId);

/*
** ============================================================================
**     GetTaskState - Definition.
** ============================================================================
*/
teE_OS_ERR GetTaskState(teOS_Task_Id taskId, te_TaskStateRef pteTaskState);

/*
** ============================================================================
**     TCM Busy - Definition.
** ============================================================================
*/
BOOL boTCMBusy(void);

#endif /*_OS_TASK_H_*/
